package daos;

import java.util.ArrayList;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import entidades.Entrenador;

public class EntrenadorDAO {
	private Session sesion;
	private Transaction tx;

	public Integer guardaEntrenador(Entrenador entrenador)
			throws HibernateException {
		Integer id = 0;

		try {
			iniciaOperacion();
			id = (Integer) sesion.save(entrenador);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}

		return id;
	}

	public void actualizaEntrenador(Entrenador entrenador)
			throws HibernateException {
		try {
			iniciaOperacion();
			sesion.update(entrenador);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}
	}

	public void eliminaEntrenador(Entrenador entrenador)
			throws HibernateException {
		try {
			iniciaOperacion();
			sesion.delete(entrenador);
			tx.commit();
		} catch (HibernateException he) {
			manejaExcepcion(he);
			throw he;
		} finally {
			sesion.close();
		}
	}

	public Entrenador obtenEntrenador(Integer idEntrenador)
			throws HibernateException {
		Entrenador entrenador = null;
		try {
			iniciaOperacion();
			entrenador = (Entrenador) sesion
					.get(Entrenador.class, idEntrenador);
		} finally {
			sesion.close();
		}

		return entrenador;
	}

	@SuppressWarnings("unchecked")
	public ArrayList<Entrenador> obtenListaEntrenador() throws HibernateException {
		ArrayList<Entrenador> listaEntrenadores = null;

		try {
			iniciaOperacion();
			listaEntrenadores = new ArrayList<Entrenador>(sesion.createQuery("from Entrenador").list());
		} finally {
			sesion.close();
			if(listaEntrenadores == null){
				listaEntrenadores = new ArrayList<Entrenador>();
				System.out.println("Es nulo");
			}
		}
		
		return listaEntrenadores;
	}

	@SuppressWarnings("unchecked")
	public ArrayList<Entrenador> consultarEntrenador(String s) throws HibernateException {
		ArrayList<Entrenador> listaEntrenadores = new ArrayList<Entrenador>();

		try {
			iniciaOperacion();
			Query q = sesion.createSQLQuery("SELECT * FROM entrenador WHERE nombres LIKE :string or apellidos LIKE :string").addEntity(Entrenador.class);
//			Query q = sesion.createQuery("from Material as m where m.descripcion = :string");
			q.setParameter("string", "%"+ s+"%");
			
			listaEntrenadores = new ArrayList<Entrenador>(q.list());
		} finally {
			sesion.close();
		}

		return listaEntrenadores;
	}
	
	private void iniciaOperacion() throws HibernateException {
		sesion = HibernateUtil.getSessionFactory().openSession();
		tx = sesion.beginTransaction();
	}

	private void manejaExcepcion(HibernateException he)
			throws HibernateException {
		tx.rollback();
		throw new HibernateException(
				"Ocurrió un error en la capa de acceso a datos", he);
	}
}
